package com.shioirikukuri.common.until;

import com.fasterxml.jackson.core.JsonProcessingException;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;
import java.util.concurrent.TimeUnit;

/**
 * Redis 工具类
 */
@Component
public class RedisUtil {

	@Resource
	private RedisTemplate<String, String> redisTemplate;

	/**
	 * 设置缓存
	 *
	 * @param key      键
	 * @param value    值
	 * @param timeout  超时时间（单位：秒）
	 */
	public <T> void set(String key, T value, long timeout) throws JsonProcessingException {
		String valueAsString = JsonUtil.toJson(value);
		redisTemplate.opsForValue().set(key, valueAsString, timeout, TimeUnit.SECONDS);
	}



	/**
	 * 获取缓存
	 *
	 * @param key 键
	 * @return 值
	 */
	public <T> T get(String key, Class<T> clazz) throws JsonProcessingException {
		String valueAsString = redisTemplate.opsForValue().get(key);
		return valueAsString == null ? null : JsonUtil.fromJson(valueAsString, clazz);
	}

	/**
	 * 删除缓存
	 *
	 * @param key 键
	 */
	public void delete(String key) {
		redisTemplate.delete(key);
	}

	/**
	 * 判断是否存在该 key
	 *
	 * @param key 键
	 * @return 是否存在
	 */
	public boolean hasKey(String key) {
		return Boolean.TRUE.equals(redisTemplate.hasKey(key));
	}

	/**
	 * 设置过期时间
	 *
	 * @param key     键
	 * @param timeout 时间
	 * @param unit    单位
	 */
	public void expire(String key, long timeout, TimeUnit unit) {
		redisTemplate.expire(key, timeout, unit);
	}
}

